package adapters

import (
	"ai-gateway/common"
	"ai-gateway/db"
	"ai-gateway/proto"
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"io"
	"net/http"

	"google.golang.org/grpc/metadata"
)

// AlibabaAdapter 阿里云AI服务适配器
type AlibabaAdapter struct{}

// 阿里云API请求结构
type alibabaRequest struct {
	Model    string    `json:"model"`
	Messages []message `json:"messages"`
}

// 消息结构
type message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

// 阿里云API响应结构
type alibabaResponse struct {
	Choices []struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
	} `json:"choices"`
	Usage struct {
		PromptTokens     int `json:"prompt_tokens"`
		CompletionTokens int `json:"completion_tokens"`
	} `json:"usage"`
}

// Call执行阿里云AI服务调用
func (a *AlibabaAdapter) Call(ctx context.Context, req *proto.AIRequest) (*proto.AIResponse, error) {
	// 获取场景信息
	md, _ := metadata.FromIncomingContext(ctx)
	scenario := ""
	if len(md.Get("scenario")) > 0 {
		scenario = md.Get("scenario")[0]
	}

	// 从数据库获取配置（只获取需要的api_key和api_url）
	var config struct {
		ApiKey string `db:"api_key"`
		ApiUrl string `db:"api_url"`
	}
	err := db.DB.Get(&config, "SELECT api_key, api_url FROM provider_configs WHERE provider = ?", "alibaba")
	if err != nil {
		return &proto.AIResponse{Result: "获取阿里配置失败"}, err
	}

	common.Logger.Info().
		Str("provider", "alibaba").
		Str("scenario", scenario).
		Msg("调用阿里通义qwen-plus")

		// 构建请求（直接指定模型为qwen-plus）
	aliReq := alibabaRequest{
		Model: "qwen-plus",
		Messages: []message{
			{Role: "user", Content: req.Prompt}, // 注意字段首字母需大写（若结构体字段是导出的）
		},
	}

	// 序列化请求
	reqBody, err := json.Marshal(aliReq)
	if err != nil {
		return nil, fmt.Errorf("序列化失败: %v", err)
	}

	// 创建HTTP请求
	httpReq, err := http.NewRequestWithContext(ctx, "POST", config.ApiUrl, bytes.NewBuffer(reqBody))
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}
	fmt.Println(config.ApiKey)
	httpReq.Header.Set("Content-Type", "application/json")
	httpReq.Header.Set("Authorization", "Bearer "+config.ApiKey)

	// 发送请求
	resp, err := http.DefaultClient.Do(httpReq)
	if err != nil {
		return nil, fmt.Errorf("调用API失败: %v", err)
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("API错误: %d, 内容: %s", resp.StatusCode, string(body))
	}
	// 解析响应
	var aliResp alibabaResponse
	if err := json.Unmarshal(body, &aliResp); err != nil {
		return nil, fmt.Errorf("解析响应失败: %v", err)
	}
	// 提取结果
	result := ""
	if len(aliResp.Choices) > 0 {
		result = aliResp.Choices[0].Message.Content
	}
	// 计算使用的token
	totalTokens := aliResp.Usage.PromptTokens + aliResp.Usage.CompletionTokens
	return &proto.AIResponse{
		Result:    result,
		Provider:  "alibaba",
		TokenUsed: int32(totalTokens),
	}, nil
}

// 注册适配器
func init() {
	RegisterAdapter("alibaba", &AlibabaAdapter{})
}
